/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package bd;
import classes.*;
import java.sql.*;
import java.util.*;
import java.util.ArrayList;
import javax.swing.JOptionPane;
/**
 *
 * @author Alan JPS
 */


public class ChamadoBD {

    public static final String QUERY_GET_CHAMADOS_SEM_ATENDIMENTO = "SELECT * FROM VIEW_SELECIONACHAMADO "+
                                                                "WHERE usu_usualt IS NULL";

    public static final String QUERY_GET_CHAMADOS_EM_ATENDIMENTO = "SELECT * FROM VIEW_SELECIONACHAMADO "+
                                                                "WHERE usu_usualt = ? AND cha_descr_solucao = ''";
    public static final String QUERY_GET_ASSENTAMENTOS_CHAMADO = "SELECT * FROM VIEW_ASSENTAMENTOCHAMADO "+
                                                                 " WHERE cha_id = ?";
    public static final String QUERY_INSERT_ASSENTAMENTOS = "{CALL AT_ASSENTAMENTOCHAMADO(NULL, ?, ?, 'IN')}";

    public static boolean salvar(Chamado chamado,Usuario usuarioLogado)
    {
        try{
            Connection conexao = Conexao.abrir();
            CallableStatement procedure = conexao.prepareCall("{call AT_CHAMADO(NULL,NULL,NULL,?,NULL,?,NULL,1,?,NULL,?)}");
            //                                                                                                   -Esse é o ID padrão para chamado sem atendimetno
            procedure.setString(1, chamado.getDescrProblema());
            //procedure.setString(2, chamado.getDescrSolucao());
            procedure.setInt(2, usuarioLogado.getId());
            procedure.setInt(3, chamado.getCategoria().getId());
            procedure.setString(4,"IN");
            procedure.execute();
            procedure.close();
            conexao.close();
            return true;
        }catch(Exception excecao)
        {
            return false;
        }
    }

    public static boolean alterar(Chamado chamado,Usuario usuarioLogado)
    {
        try{
            Connection conexao = Conexao.abrir();
            CallableStatement procedure = conexao.prepareCall("{call AT_CHAMADO(?,?,?,?,?,NULL,?,?,?,?,?)}");
            procedure.setInt(1, chamado.getId());
            procedure.setDate(2, (java.sql.Date)chamado.getDataAbertura());
            procedure.setDate(3, (java.sql.Date)chamado.getDataEncerramento());
            procedure.setString(4, chamado.getDescrProblema());
            procedure.setString(5, chamado.getDescrSolucao());
            procedure.setInt(6, usuarioLogado.getId());
            procedure.setInt(7, chamado.getStatus().getId());
            procedure.setInt(8, chamado.getCategoria().getId());
            procedure.setInt(9, usuarioLogado.getId());
            procedure.setString(10,"AL");

            procedure.execute();
            procedure.close();
            conexao.close();
            return true;

        }catch(Exception excecao)
        {
            return false;
        }
    }

    public static boolean deletar(int codigo)
    {
        try{
            Connection conexao = Conexao.abrir();
            CallableStatement procedure = conexao.prepareCall("{call AT_CHAMADO(?,?,?,?,?,?,?,?,?,?,?)}");
            procedure.setInt(1, codigo);
            procedure.setDate(2, null);
            procedure.setDate(3, null);
            procedure.setString(4, null);
            procedure.setString(5,null);
            procedure.setInt(6, (Integer)null);
            procedure.setInt(7, (Integer)null);
            procedure.setInt(8, (Integer)null);
            procedure.setInt(9, (Integer)null);
            procedure.setInt(10, (Integer)null);
            procedure.setString(11,"");

            procedure.execute();
            procedure.close();
            conexao.close();
            return true;
        }catch(Exception excecao)
        {
            return false;
        }
    }

    public static Chamado selecionar(int codigo)
    {
        Chamado retorno = null;
        try{
            Connection conexao = Conexao.abrir();
            Statement comandoSelect = conexao.createStatement();
            ResultSet resultado = comandoSelect.executeQuery("select * from VIEW_SELECIONACHAMADO where cha_id="+codigo+"");
            if(resultado.next())
            {
                Chamado novoChamado = new Chamado();
                novoChamado.setId(codigo);
                novoChamado.setDataAbertura(resultado.getDate("cha_data_abert"));
                novoChamado.setDataEncerramento(resultado.getDate("cha_data_encer"));
                novoChamado.setDescrProblema(resultado.getString("cha_descr_problema"));
                novoChamado.setDescrSolucao(resultado.getString("cha_descr_solucao"));
                novoChamado.setUsuarioAbertura(UsuarioBD.selecionar(resultado.getInt("usu_id_abertura")));
                novoChamado.setUsuarioEncerramento(UsuarioBD.selecionar(resultado.getInt("usu_id_encer")));
                novoChamado.setStatus(StatusChamadoBD.selecionar(resultado.getInt("sta_id")));
                novoChamado.setCategoria(CategoriaChamadoBD.selecionar(resultado.getInt("cac_id")));
                ResultSet resultadoAnexos = comandoSelect.executeQuery("select * from VIEW_SELECIONAANEXO where cha_id="+codigo+"");
                ArrayList<Anexo> vetAnexos = new ArrayList<Anexo>();
                while (resultadoAnexos.next())
                {
                    Anexo novoAnexo = new Anexo();
                    novoAnexo.setId(resultadoAnexos.getInt("ane_id"));
                    novoAnexo.setArquivo(null);
                    vetAnexos.add(novoAnexo);
                }
                novoChamado.setListAnexos(vetAnexos);
                retorno = novoChamado;
            }
            conexao.close();
            return retorno;
        }catch(Exception excecao)
        {
            return null;
        }
    }

    public static ArrayList<Chamado> selecionar()
    {
        ArrayList<Chamado> vetChamados = new ArrayList<Chamado>();
        try{
            Connection conexao = Conexao.abrir();
            Statement comandoSelect = conexao.createStatement();
            ResultSet resultado = comandoSelect.executeQuery("select * from VIEW_SELECIONACHAMADO");
            while(resultado.next())
            {
                Chamado novoChamado = new Chamado();
                novoChamado.setId(resultado.getInt("cha_id"));
                novoChamado.setDataAbertura(resultado.getDate("cha_data_abert"));
                novoChamado.setDataEncerramento(resultado.getDate("cha_data_encer"));
                novoChamado.setDescrProblema(resultado.getString("cha_descr_problema"));
                novoChamado.setDescrSolucao(resultado.getString("cha_descr_solucao"));
                novoChamado.setUsuarioAbertura(UsuarioBD.selecionar(resultado.getInt("usu_id_abertura")));  // USUARIOBD ??????
                novoChamado.setUsuarioEncerramento(UsuarioBD.selecionar(resultado.getInt("usu_id_encer")));
                novoChamado.setStatus(StatusChamadoBD.selecionar(resultado.getInt("sta_id")));
                novoChamado.setCategoria(CategoriaChamadoBD.selecionar(resultado.getInt("cac_id")));
                ResultSet resultadoAnexos = comandoSelect.executeQuery("select * from VIEW_SELECIONAANEXO where cha_id="+novoChamado.getId()+"");
                ArrayList<Anexo> vetAnexos = new ArrayList<Anexo>();
                while (resultadoAnexos.next())
                {
                    Anexo novoAnexo = new Anexo();
                    novoAnexo.setId(resultadoAnexos.getInt("ane_id"));
                    novoAnexo.setArquivo(null);
                    vetAnexos.add(novoAnexo);
                }
                novoChamado.setListAnexos(vetAnexos);
                vetChamados.add(novoChamado);
            }
            conexao.close();
            return vetChamados;
        }catch(Exception excecao)
        {
            return null;
        }
    }

    public static Chamado getLastIdChamado()
    {
        Chamado chamado = new Chamado();
        Connection conn = null;
        PreparedStatement stm = null;
        ResultSet rs = null;
        try
        {
            conn = Conexao.abrir();
            stm = conn.prepareStatement("SELECT nvl(MAX(cha_id), 1) AS id_chamado FROM VIEW_SELECIONACHAMADO");
            rs = stm.executeQuery();
            if(rs.next())
            {
                chamado.setId(rs.getInt("id_chamado"));
            }
        }
        catch(SQLException ex)
        {
            JOptionPane.showMessageDialog(null, "Erro em ChamadoBD.getLastIdChamado() : \n"+
                                                ex.getMessage(),
                                                "Erro ao processar requisição",
                                                JOptionPane.ERROR_MESSAGE);
        }
        return chamado;
    }

    public static ArrayList<Chamado> getChamadosSemAtendimento()
    {
        ArrayList<Chamado> listChamado = new ArrayList<Chamado>();
        Connection conn = Conexao.abrir();
        try
        {
            PreparedStatement stm = conn.prepareCall(QUERY_GET_CHAMADOS_SEM_ATENDIMENTO);
            ResultSet rs = stm.executeQuery();
            while(rs.next())
            {
                Chamado chamado = new Chamado();
                chamado.setId(rs.getInt("cha_id"));
                chamado.setDataAbertura(rs.getDate("cha_data_abert"));
                chamado.setDataEncerramento(rs.getDate("cha_data_encer"));
                chamado.setDescrProblema(rs.getString("cha_descr_problema"));
                Usuario usuarioAbertura = new Usuario();
                usuarioAbertura.setNome(rs.getString("usu_nome"));
                chamado.setUsuarioAbertura(usuarioAbertura);
                StatusChamado sts = new StatusChamado();
                sts.setDescr(rs.getString("sta_descr"));
                chamado.setStatus(sts);
                CategoriaChamado cat = new CategoriaChamado();
                cat.setDescr(rs.getString("cac_descr"));
                chamado.setCategoria(cat);
                listChamado.add(chamado);
            }
            return listChamado;
        }
        catch(SQLException ex)
        {
            JOptionPane.showMessageDialog(null, "Exceção no método getChamadosSemAtendimento() em ChamadoBD: "+
                    ex.getMessage());
            return listChamado;
        }
    }

    public static ArrayList<Chamado> getChamadosEmAtendimento(int usuarioLogado)
    {
        ArrayList<Chamado> listChamado = new ArrayList<Chamado>();
        Connection conn = Conexao.abrir();
        try
        {
            PreparedStatement stm = conn.prepareCall(QUERY_GET_CHAMADOS_EM_ATENDIMENTO);
            stm.setInt(1, usuarioLogado);
            ResultSet rs = stm.executeQuery();
            while(rs.next())
            {
                Chamado chamado = new Chamado();
                chamado.setId(rs.getInt("cha_id"));
                chamado.setDataAbertura(rs.getDate("cha_data_abert"));
                chamado.setDataEncerramento(rs.getDate("cha_data_encer"));
                chamado.setDescrProblema(rs.getString("cha_descr_problema"));
                Usuario usuarioAbertura = new Usuario();
                usuarioAbertura.setNome(rs.getString("usu_nome"));
                chamado.setUsuarioAbertura(usuarioAbertura);
                StatusChamado sts = new StatusChamado();
                sts.setDescr(rs.getString("sta_descr"));
                chamado.setStatus(sts);
                CategoriaChamado cat = new CategoriaChamado();
                cat.setDescr(rs.getString("cac_descr"));
                chamado.setCategoria(cat);
                listChamado.add(chamado);
            }
            return listChamado;
        }
        catch(SQLException ex)
        {
            JOptionPane.showMessageDialog(null, "Exceção no método getChamadosEmAtendimento() em ChamadoBD: "+
                    ex.getMessage());
            return listChamado;
        }
    }

    public static ArrayList<String> getAssentamentosChamado(int idChamado)
    {
        ArrayList<String> listAssentamentos = new ArrayList<String>();
        Connection conn = Conexao.abrir();
        try
        {
            PreparedStatement stm = conn.prepareCall(QUERY_GET_ASSENTAMENTOS_CHAMADO);
            stm.setInt(1, idChamado);
            ResultSet rs = stm.executeQuery();
            while(rs.next())
            {
                listAssentamentos.add(rs.getString("asc_descr"));
            }
            return listAssentamentos;
        }
        catch(SQLException ex)
        {
            JOptionPane.showMessageDialog(null, "Exceção no método getChamadosEmAtendimento() em ChamadoBD: "+
                    ex.getMessage());
            return listAssentamentos;
        }
    }

    public static boolean insertAssentamentoChamado(String assentamento, int idChamado)
    {
         try{
            Connection conexao = Conexao.abrir();
            CallableStatement procedure = conexao.prepareCall(QUERY_INSERT_ASSENTAMENTOS);
            procedure.setString(1, assentamento);
            procedure.setInt(2, idChamado);
            procedure.execute();
            procedure.close();
            conexao.close();
            return true;
        }catch(Exception excecao)
        {
            return false;
        }
    }

}
